package com.tarena.csmall.order.web.service;

import cn.tedu.mall.pojo.order.dto.OrderAddDTO;
import cn.tedu.mall.pojo.order.dto.OrderItemAddDTO;
import cn.tedu.mall.pojo.order.model.OmsOrder;
import cn.tedu.mall.pojo.seckill.dto.SeckillOrderAddDTO;
import cn.tedu.mall.pojo.seckill.dto.SeckillStockDTO;
import com.tarena.csmall.order.web.repository.OrderRepository;
import com.tarena.csmall.seckill.api.SeckillStockApi;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class SeckillOrderService {
    /**
     * 1. dubbo 远程调用减库存 seckill seckill_stock 保存这秒杀商品库存数
     * 2. 数据封装 OmsOrder OmsOrderItem 写入数据库 repository
     * 3. 发送一个生单的延迟消息 携带一个订单sn
     * @param dto
     */
    //应该由seckill系统给我提供一个远程调用的接口
    @DubboReference
    private SeckillStockApi seckillStockApi;
    @Autowired
    private OrderRepository orderRepository;
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    public void orderAdd(SeckillOrderAddDTO dto) {
        //dubbo远程调用减库存 orderSn skuId quantity
        SeckillStockDTO seckillStockDTO=generateSeckillStockDTO(dto);
        try{
            seckillStockApi.reduceSeckillStock(seckillStockDTO);
        }catch (Exception e){
            log.error("远程减库存异常,异常信息:{}",e.getMessage(),e);
            return;
        }
        OrderAddDTO orderAddDTO=null;
        try{
            //数据封装 OmsOrder OmsOrderItem 写入数据库 repository
            int count=orderRepository.countOrderSn(dto.getSn());
            if (count>0){
                //说明这个order已经存在了,当前订单是重复新增
                log.info("订单已经存在,重复新增,订单号:{}",dto.getSn());
                return;
            }
            orderAddDTO =generateOrderAddDTO(dto);
            orderRepository.orderAdd(orderAddDTO);
        }catch (Exception e){
            log.error("订单新增入库 异常",e);
        }
        try{
            //发送一个订单生成延迟消息 20分钟
            Message message= MessageBuilder.withPayload(orderAddDTO).build();
            //30秒延迟测试+
            rocketMQTemplate.syncSend("order_delay_topic",message,2000,4);
            log.info("延迟消息已经发送,库存减少,订单生成:{}",orderAddDTO);
        }catch (Exception e){
            log.error("延迟消息发送异常",e);
        }

    }

    private OrderAddDTO generateOrderAddDTO(SeckillOrderAddDTO dto) {
        OrderAddDTO orderAddDTO=new OrderAddDTO();
        //订单下的商品
        List<OrderItemAddDTO> orderItems=new ArrayList<>();
        //秒杀dto给orderAddDTO封装属性,
        BeanUtils.copyProperties(dto,orderAddDTO);
        //orderAddDTO 缺少订单商品
        OrderItemAddDTO orderItemAddDTO=new OrderItemAddDTO();
        BeanUtils.copyProperties(dto.getSeckillOrderItemAddDTO(),orderItemAddDTO);
        orderItems.add(orderItemAddDTO);
        orderAddDTO.setOrderItems(orderItems);
        return orderAddDTO;
    }

    private SeckillStockDTO generateSeckillStockDTO(SeckillOrderAddDTO dto) {
        SeckillStockDTO seckillStockDTO=new SeckillStockDTO();
        seckillStockDTO.setQuantity(dto.getSeckillOrderItemAddDTO().getQuantity());
        seckillStockDTO.setSn(dto.getSn());
        seckillStockDTO.setSkuId(dto.getSeckillOrderItemAddDTO().getSkuId());
        return seckillStockDTO;
    }
}
